package ru.spb.nicetu.altx.mnemo.math.managers;

import java.lang.ref.WeakReference;
import java.util.LinkedList;
import java.util.List;

import ru.spb.nicetu.altx.mnemo.extpoint.valuetypes.IProxyValueType;
import ru.spb.nicetu.altx.mnemo.extpoint.valuetypes.ITemplateValueType;
import ru.spb.nicetu.altx.mnemo.extpoint.valuetypes.ProxyValueType;

/**
 * TODO javadoc for PerformanceManager
 */
public class PerformanceManager {
  //**************************************************************************//
  //                        Enums                                             //
  //**************************************************************************//

  //**************************************************************************//
  //                        Members                                           //
  //**************************************************************************//
  private static PerformanceManager instance = new PerformanceManager();

  private List<WeakReference<ITemplateValueType>> valuesInSystem
    = new LinkedList<WeakReference<ITemplateValueType>>();
  private List<WeakReference<ITemplateValueType>> proxyValuesInSystem
    = new LinkedList<WeakReference<ITemplateValueType>>();
  //**************************************************************************//
  //                        Constructors                                      //
  //**************************************************************************//
  protected PerformanceManager() {
  }
  //**************************************************************************//
  //                        Getters                                           //
  //**************************************************************************//
  public static PerformanceManager getInstance() {
    return instance;
  }
  //**************************************************************************//
  //                        Setters                                           //
  //**************************************************************************//
  public void registerValue(ITemplateValueType value) {
    if (value instanceof IProxyValueType)
      proxyValuesInSystem.add(new WeakReference<ITemplateValueType>(value));
    else
      valuesInSystem.add(new WeakReference<ITemplateValueType>(value));
  }

  public void printValueStatistic() {
    System.out.println("*********** Values Statistic *********************");
    printValueStatistic(valuesInSystem);
    System.out.println("****** Proxy Value Statistic *********************");
    printValueStatistic(proxyValuesInSystem);
  }

  public void printValueStatistic(List<WeakReference<ITemplateValueType>> values) {
    int registered = 0;
    int alive = 0;
    int aliveAlive = 0;
    for (WeakReference<ITemplateValueType> reference : values) {
      registered++;
      ITemplateValueType get = reference.get();
      if (get != null) {
        alive++;
        if (get instanceof ProxyValueType) {
          if (((ProxyValueType)get).hasAliveValue()) {
            aliveAlive++;
          }
        }
      }
    }
    System.out.println("***********************************************");
    System.out.println("** size       = "+values.size());
    System.out.println("** alive      = "+alive);
    System.out.println("** aliveAlive      = "+aliveAlive);
    System.out.println("** registered = "+registered);
    System.out.println("***********************************************");
  }

  //**************************************************************************//
  //                        Publics                                           //
  //**************************************************************************//

  //**************************************************************************//
  //                        Abstracts                                         //
  //**************************************************************************//

  //**************************************************************************//
  //                        Protected                                         //
  //**************************************************************************//

  //**************************************************************************//
  //                        Privates                                          //
  //**************************************************************************//

  //**************************************************************************//
  //                        Public Statics                                    //
  //**************************************************************************//

  //**************************************************************************//
  //                        Private Statics                                   //
  //**************************************************************************//

  //**************************************************************************//
  //                        Internal Classes                                  //
  //**************************************************************************//
}
